unit ValidateFunctions;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils,commonetypes,LazUTF8;
const
  fstrValueIsEmtyString='Значение не может быть пустой строкой.';
  fstrValueNotDate='Значение не может быть датой. Формат даты "%S".';
  fstrValueNotInt='Значение не может быть целым числом.';
  fstrValueIsEmptyDate='Значение не может быть пустой датой.';
  fstrValueNotFloat='Значение не может быть числом.';
  fstrValueNotNumericWord='Значение может содежать только цифры.';
  fstrValueNotLiterNumericStrWord='Значение может содежать только буквы и цифры.';
  fstrValueNotLiterWord='Значение может содежать только буквы.';

type
  function IsNotEnptyDate(Const Value:String;Var Cause:String):Boolean;
  function IsNotEnptyStr(Const Value:String;Var Cause:String):Boolean;
  function IsValidStrDate(Const Value:String;Var Cause:String):Boolean;
  function IsValidStrInt(Const Value:String;Var Cause:String):Boolean;
  function IsValidStrFloat(Const Value:String;Var Cause:String):Boolean;
  function IsValidStrNumericWord(Const Value:String;Var Cause:String):Boolean;//Правильное слово не содержащее ни чего кроме Цифр
  function IsValidStrLiterNumericWord(Const Value:String;Var Cause:String):Boolean;//Правильное слово не содержащее ни чего кромебукв и Цифр
  function IsValidStrLiterWord(const Value: String): Boolean;//слово содержит только беквы  и цифры
implementation
 function IsValidStrDate(Const Value: String;Var Cause:String): Boolean;
VAr
  F:TDateTime;
begin
  try
    F:=StrToDateTime(Value,LocalFormatSettings);
    Result:=True;
  except
    Result:=False;
    Cause:= Format(fstrValueNotDate,[LocalFormatSettings.LongDateFormat+' 'LocalFormatSettings.LongTimeFormat])
  end;
end;

function IsValidStrInt(Const Value: String;Var Cause:String): Boolean;
VAr
  F:Integer;
begin
  try
    F:=StrToInt(Value);
    Result:=True;
  except
    Result:=False;
    Cause:=fstrValueNotInt;
  end;
end;

function IsValidStrFloat(Const Value: String;Var Cause:String): Boolean;
VAr
  F:Extended;
begin
  try
    F:=StrToFloat(Value);
    Result:=True;
  except
    Result:=False;
    Cause:=fstrValueNotFloat;
  end;
end;

function IsNotEnptyDate(const Value: String; var Cause: String): Boolean;
var
  d:TDateTime;
begin
  if Not IsValidStrDate(Value,Cause) then
     begin
       Result:=False;
     end
  else
     begin
       d:=StrToDateTime(Value,LocalFormatSettings);
       if d=0 then
         begin
           Result:=False;
           Cause:=fstrValueIsEmptyDate;
         end
        else Result:=True;
     end;
end;

function IsNotEnptyStr(const Value: String; var Cause: String): Boolean;
begin
  if UTF8Trim(s)='' then result:=True
  else
    begin
      result:=False;
      Cause:=fstrEmtyString;
    end;
end;


function IsValidStrCharWord(const Value: String): Boolean;
var
  i: Integer;
begin
 for i:= 1 to UTF8Length(S) do
 begin
   if NOT (IsUTF8RULitera(UTF8Copy(S,i,1))
          or IsLitera(UTF8Copy(S,i,1))) then
     begin
       Result:=False;
       Couse:fstrValueNotLiterWord;
     end
   else
   Result:=true;
 end;
end;

function IsValidStrNumericWord(const Value: String): Boolean;
var
  i: Integer;
begin
 for i:= 1 to UTF8Length(S) do
 begin
   if NOT (IsDidgit(UTF8Copy(S,i,1))) then
     begin
       Result:=False;
       Couse:fstrValueNotNumericWord;
     end
   else
   Result:=true;
 end;
end;

function IsValidStrLiterNumericWord(const Value: String): Boolean;
var
  i: Integer;
begin
 for i:= 1 to UTF8Length(S) do
 begin
   if NOT (IsUTF8RULitera(UTF8Copy(S,i,1))
          or IsLitera(UTF8Copy(S,i,1))
          or IsDidgit(UTF8Copy(S,i,1))) then
     begin
       Result:=False;
       Couse:fstrValueNotStrLiterNumericWord;
     end
   else
   Result:=true;
 end;
end;

end.

